package com.zero.guava.samples.Cache;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

/**
 * 统计信息
 * 在构建Cache对象时,可以通过CacheBuilder的recordStats方法开启统计信息的开关.
 * 开关开启后Cache会自动对缓存的各种操作进行统计,调用Cache的stats方法可以查看
 * 统计后的信息.
 * requestCount()：返回Cache的lookup方法查找缓存的次数,不论查找的值是否被缓存
 * hitCount()：返回Cache的lookup方法命中缓存的次数
 * hitRate()：返回缓存请求的命中率,返回缓存请求的命中率命中次数除以请求次数
 * missCount()：返回缓存请求的未命中的次数
 * missRate()：返回缓存请求未命中的比率,未命中次数除以请求次数
 * loadCount()：返回缓存调用load方法加载新值的次数
 * loadSuccessCount()：返回缓存加载新值的成功次数
 * loadExceptionCount()：返回缓存加载新值出现异常的次数
 * loadExceptionRate()：返回缓存加载新值出现异常的比率
 * totalLoadTime()：返回缓存加载新值所耗费的总时间
 * averageLoadPenalty()：缓存加载新值的耗费的平均时间，加载的次数除以加载的总时间
 * evictionCount()：返回缓存中条目被移除的次数
 * minus(CacheStats other)：返回一个新的表示当前CacheStats与传入CacheStats之间差异的CacheStats实例
 * plus(CacheStats other)：返回一个新的表示当前CacheStats与传入CacheStats之间总计的CacheStats实例
 */
public class RecordStats {

    public static void main(String[] args) {

        Cache<String, String> cache = CacheBuilder.newBuilder()
                .maximumSize(3)
                .recordStats()
                .build();

        cache.put("key1","value1");
        cache.put("key2","value2");
        cache.put("key3","value3");
        cache.put("key4","value4");
        cache.put("key5","value5");
        cache.put("key6","value6");

        cache.getIfPresent("key1");
        cache.getIfPresent("key2");
        cache.getIfPresent("key3");
        cache.getIfPresent("key4");


        System.out.println(cache.stats());

        long hitCount = cache.stats().hitCount();
        long missCount = cache.stats().missCount();
        System.out.println(hitCount);
        System.out.println(missCount);

        //CacheStats{hitCount=1, missCount=3, loadSuccessCount=0, loadExceptionCount=0, totalLoadTime=0, evictionCount=3}
        //这些统计信息对于调整缓存设置是至关重要的,在性能要求高的应用中应该密切关注这些数据
    }
}
